#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据处理工具 - 核心数据处理函数
包含剂量值处理、职业类别映射等功能
"""

import re
from app.config import OCCUPATION_MAPPING, APP_SETTINGS


def process_dose_value(dose_str):
    """处理剂量当量值的特殊逻辑
    
    Args:
        dose_str: 原始剂量字符串
        
    Returns:
        str: 处理后的剂量值
    """
    if not dose_str or dose_str.strip() == "":
        return ""
    
    dose_str = dose_str.strip()
    
    # 特殊值处理
    if "＜MDL" in dose_str or "<MDL" in dose_str:
        return "0.03"
    elif dose_str == "MDL":
        return "0.06"
    else:
        # 尝试提取数值
        try:
            # 使用正则提取数字（包括小数）
            number_pattern = r'(\d+\.?\d*)'
            match = re.search(number_pattern, dose_str)
            if match:
                return match.group(1)
            else:
                return dose_str
        except:
            return dose_str


def get_protection_type(occupation_code):
    """根据职业类别确定防护类型
    
    Args:
        occupation_code: 职业类别代码
        
    Returns:
        str: 防护类型 '是' 或 '否'
    """
    # 除了职业类别为2E的都是否
    if occupation_code == '2E':
        return '是'
    else:
        return '否'


def map_occupation_code(occupation_code):
    """映射职业类别代码到描述，格式为 (编号)描述
    
    Args:
        occupation_code: 职业类别代码
        
    Returns:
        str: 职业类别描述，格式如 "(2A)诊断放射学"
    """
    description = OCCUPATION_MAPPING.get(occupation_code, "")
    
    if description:
        # 返回 (编号)描述 格式
        return f"({occupation_code}){description}"
    else:
        # 如果找不到描述，只返回编号
        return occupation_code


def check_dose_level(dose_value, threshold=None):
    """检查是否超调查水平
    
    Args:
        dose_value: 剂量值
        threshold: 阈值，如果不提供则使用季度阈值
        
    Returns:
        str: '是' 或 '否'
    """
    try:
        if threshold is None:
            threshold = APP_SETTINGS['QUARTERLY_DOSE_THRESHOLD']
        
        if isinstance(dose_value, str):
            # 移除可能的非数字字符，只保留数字和小数点
            dose_str = re.sub(r'[^\d.]', '', dose_value)
            if dose_str:
                dose_float = float(dose_str)
            else:
                return '否'  # 无法解析时默认为否
        else:
            dose_float = float(dose_value)
        
        # 如果剂量当量>=阈值为是，否则为否
        return '是' if dose_float >= threshold else '否'
    except:
        return '否'  # 异常时默认为否


def clean_text_field(value, default=""):
    """清理文本字段，处理None和NaN值
    
    Args:
        value: 输入值
        default: 默认值
        
    Returns:
        str: 清理后的文本
    """
    if value is None:
        return default
    
    text = str(value).strip()
    if text.lower() in ['nan', 'none', 'null']:
        return default
    
    return text


def normalize_dose_value(dose_value):
    """标准化剂量值为数字类型
    
    Args:
        dose_value: 剂量值（字符串或数字）
        
    Returns:
        float: 标准化后的数字值，异常时返回0
    """
    try:
        if isinstance(dose_value, (int, float)):
            return float(dose_value)
        
        if isinstance(dose_value, str):
            # 移除非数字字符，保留数字和小数点
            clean_value = re.sub(r'[^\d.]', '', dose_value.strip())
            if clean_value:
                return float(clean_value)
        
        return 0.0
    except:
        return 0.0
